package com.netflix.governator; import com.google.inject.AbstractModule; import com.google.inject.Key; import com.netflix.governator.ProvisionMetrics.Element; import com.netflix.governator.ProvisionMetrics.Visitor; import com.netflix.governator.visitors.ProvisionListenerTracingVisitor; import org.junit.Assert; import org.junit.Test; import java.util.concurrent.TimeUnit; import javax.annotation.PostConstruct; import javax.inject.Singleton; public class ProvisionMetricsModuleTest { @Test public void disableMetrics() { try (LifecycleInjector injector = InjectorBuilder.fromModule( new AbstractModule() { @Override protected void configure() { bind(ProvisionMetrics.class).to(NullProvisionMetrics.class); } }) .createInjector()) { ProvisionMetrics metrics = injector.getInstance(ProvisionMetrics.class); LoggingProvisionMetricsVisitor visitor = new LoggingProvisionMetricsVisitor(); metrics.accept(visitor); Assert.assertTrue(visitor.getElementCount() == 0); } } @Test public void confirmDedupWorksWithOverride() { try (LifecycleInjector injector = InjectorBuilder.fromModule( new AbstractModule() { @Override protected void configure() { install(new ProvisionMetricsModule()); } }) // Confirm that installing ProvisionMetricsModule twice isn't broken with overrides .overrideWith(new AbstractModule() { @Override protected void configure() { } }) .createInjector()) { ProvisionMetrics metrics = injector.getInstance(ProvisionMetrics.class); LoggingProvisionMetricsVisitor visitor = new LoggingProvisionMetricsVisitor(); metrics.accept(visitor); Assert.assertTrue(visitor.getElementCount() != 0); } } @Singleton public static class Foo { public Foo() throws InterruptedException { TimeUnit.MILLISECONDS.sleep(200); } @PostConstruct public void init() throws InterruptedException { TimeUnit.MILLISECONDS.sleep(200); } } public class KeyTrackingVisitor implements Visitor { private Element element; private Key key; KeyTrackingVisitor(Key key) { this.key = key; } @Override public void visit(Element element) { if (element.getKey().equals(key)) { this.element = element; } } Element getElement() { return element; } } @Test public void confirmMetricsIncludePostConstruct() { try (LifecycleInjector injector = InjectorBuilder.fromModules( new ProvisionDebugModule(), new AbstractModule() { @Override protected void configure() { bind(Foo.class).asEagerSingleton(); } }) .traceEachElement(new ProvisionListenerTracingVisitor()) .createInjector()) { ProvisionMetrics metrics = injector.getInstance(ProvisionMetrics.class); KeyTrackingVisitor keyTracker = new KeyTrackingVisitor(Key.get(Foo.class)); metrics.accept(keyTracker); Assert.assertNotNull(keyTracker.getElement()); Assert.assertTrue(keyTracker.getElement().getTotalDuration(TimeUnit.MILLISECONDS) > 300); } } }